R es un lenguaje de programación y un entorno de software diseñado específicamente para estadísticas y análisis de datos. Desarrollado por estadísticos y científicos computacionales, R proporciona herramientas robustas para manipular, visualizar y modelar datos, convirtiéndolo en una opción popular entre profesionales en campos como la ciencia de datos, la investigación académica y la analítica empresarial. Su naturaleza de código abierto y la amplia gama de paquetes y extensiones disponibles permiten a los usuarios personalizar y ampliar sus capacidades según sus necesidades específicas. R se destaca por su flexibilidad y potencia en la exploración y comprensión de datos, convirtiéndolo en una herramienta valiosa en el mundo del análisis estadístico.
La importación de datos es un proceso crucial en cualquier análisis de datos, ya que la calidad y la precisión de los resultados dependen en gran medida de la calidad de los datos de entrada. La importancia de importar datos desde distintas fuentes radica en la diversidad y complejidad de la información que puede ser crucial para la toma de decisiones informadas
# Especificar la ruta del archivo Excel
ruta_archivo <- "01_Informacion_Data/Bureau_Labor_of_Statistics_Data/Detroit_Warren_Dearborn.xlsx"# Cargar la biblioteca openxlsx para trabajar con archivos Excel
library(openxlsx)
# Leer datos desde la primera hoja del archivo Excel
Employment_1 <- read.xlsx(ruta_archivo, sheet = 1)
# Imprimir los datos cargados para verificar la lectura correcta del archivo
Employment_1Es frecuente toparse con archivos Excel que presentan encabezados o filas vacías previas a los datos reales. Tanto las bibliotecas readxl como openxlsx brindan una solución sencilla para abordar esta situación.
Aquí tienes un ejemplo utilizando la biblioteca readxl:
# install.packages("readxl")
library(readxl)
# Leer el archivo Excel, omitiendo 10 filas al principio
Employment <- read_excel(
path = ruta_archivo,
sheet = "BLS Data Series",
skip = 10
)
EmploymentEste código ejemplifica cómo cargar un archivo Excel, específicamente desde la hoja “BLS Data Series”, omitiendo las primeras 10 filas que contienen encabezados o información no deseada.
# Especificar la ruta del archivo CSV
file_ruta <- "01_Informacion_Data/Zillow/Zip_zhvi_uc_sfrcondo_tier_0.33_0.67_sm_sa_month.csv"
# Leer el archivo Excel
Zillow <- read.csv(file = file_ruta)
head(Zillow)En el ámbito del análisis de datos, la eficiencia y la consistencia en la manipulación de conjuntos de datos son fundamentales. En este contexto, el presente documento explora un script en R diseñado para automatizar la extracción, manipulación y limpieza de datos.
El script aborda la gestión de archivos ZIP que contienen información demográfica clave, extraída de diversas fuentes. A través de una serie de pasos, el código facilita la obtención, procesamiento y consolidación de datos en un formato más manejable y analítico.
El análisis se inicia con la configuración del directorio de trabajo y la identificación de archivos ZIP relevantes. A continuación, se descomprimen estos archivos para revelar conjuntos de datos en formato CSV. Estos datos son entonces leídos, manipulados y agregados en un marco de datos unificado. Además, se realiza una limpieza de archivos temporales para mantener la integridad del espacio de trabajo.
El objetivo de este script es proporcionar una herramienta eficaz para investigadores, analistas y profesionales de datos que deseen analizar y comprender las tendencias demográficas a lo largo del tiempo.
A lo largo del documento, se detallarán cada una de las secciones del código, explicando las decisiones de diseño y brindando orientación sobre cómo adaptar el script a diferentes contextos y conjuntos de datos.
Acompáñenos en este recorrido a través de un proceso automatizado que simplifica la gestión y análisis de datos demográficos del United States Census Bureau en el entorno de programación R.
¡Comencemos!
# Cargar la biblioteca
library(purrr)
library(tidyverse)
library(readr)
# Configuración del directorio y archivos ZIP
my_dir <- "01_Informacion_Data/US_Census_Bureau/"
zip_files <- list.files(path = my_dir, pattern = "*.zip", full.names = TRUE)
# Descomprimir archivos ZIP
unzip_files <- map(zip_files, ~unzip(.x, exdir = my_dir))En esta sección, se configura el directorio de trabajo y se identifican los archivos ZIP en el directorio. Luego, se descomprimen los archivos ZIP en la misma ubicación.
## [1] "01_Informacion_Data/US_Census_Bureau/ACSDP5Y2011.DP05-Column-Metadata.csv"
## [2] "01_Informacion_Data/US_Census_Bureau/ACSDP5Y2011.DP05-Data.csv"
## [3] "01_Informacion_Data/US_Census_Bureau/ACSDP5Y2011.DP05-Table-Notes.txt"
## [4] "01_Informacion_Data/US_Census_Bureau/ACSDP5Y2011.DP05_2022-10-31T180229.zip"
## [5] "01_Informacion_Data/US_Census_Bureau/ACSDP5Y2012.DP05-Column-Metadata.csv"
## [6] "01_Informacion_Data/US_Census_Bureau/ACSDP5Y2012.DP05-Data.csv"
## [7] "01_Informacion_Data/US_Census_Bureau/ACSDP5Y2012.DP05-Table-Notes.txt"
## [8] "01_Informacion_Data/US_Census_Bureau/ACSDP5Y2012.DP05_2022-11-01T080453.zip"
## [9] "01_Informacion_Data/US_Census_Bureau/ACSDP5Y2013.DP05-Column-Metadata.csv"
## [10] "01_Informacion_Data/US_Census_Bureau/ACSDP5Y2013.DP05-Data.csv"
## [11] "01_Informacion_Data/US_Census_Bureau/ACSDP5Y2013.DP05-Table-Notes.txt"
## [12] "01_Informacion_Data/US_Census_Bureau/ACSDP5Y2013.DP05_2022-11-01T081112.zip"
## [13] "01_Informacion_Data/US_Census_Bureau/ACSDP5Y2014.DP05-Column-Metadata.csv"
## [14] "01_Informacion_Data/US_Census_Bureau/ACSDP5Y2014.DP05-Data.csv"
## [15] "01_Informacion_Data/US_Census_Bureau/ACSDP5Y2014.DP05-Table-Notes.txt"
## [16] "01_Informacion_Data/US_Census_Bureau/ACSDP5Y2014.DP05_2022-11-01T081604.zip"
## [17] "01_Informacion_Data/US_Census_Bureau/ACSDP5Y2015.DP05-Column-Metadata.csv"
## [18] "01_Informacion_Data/US_Census_Bureau/ACSDP5Y2015.DP05-Data.csv"
## [19] "01_Informacion_Data/US_Census_Bureau/ACSDP5Y2015.DP05-Table-Notes.txt"
## [20] "01_Informacion_Data/US_Census_Bureau/ACSDP5Y2015.DP05_2022-11-01T081827.zip"
## [21] "01_Informacion_Data/US_Census_Bureau/ACSDP5Y2016.DP05-Column-Metadata.csv"
## [22] "01_Informacion_Data/US_Census_Bureau/ACSDP5Y2016.DP05-Data.csv"
## [23] "01_Informacion_Data/US_Census_Bureau/ACSDP5Y2016.DP05-Table-Notes.txt"
## [24] "01_Informacion_Data/US_Census_Bureau/ACSDP5Y2016.DP05_2022-11-01T082249.zip"
## [25] "01_Informacion_Data/US_Census_Bureau/ACSDP5Y2017.DP05-Column-Metadata.csv"
## [26] "01_Informacion_Data/US_Census_Bureau/ACSDP5Y2017.DP05-Data.csv"
## [27] "01_Informacion_Data/US_Census_Bureau/ACSDP5Y2017.DP05-Table-Notes.txt"
## [28] "01_Informacion_Data/US_Census_Bureau/ACSDP5Y2017.DP05_2022-11-01T082643.zip"
## [29] "01_Informacion_Data/US_Census_Bureau/ACSDP5Y2018.DP05-Column-Metadata.csv"
## [30] "01_Informacion_Data/US_Census_Bureau/ACSDP5Y2018.DP05-Data.csv"
## [31] "01_Informacion_Data/US_Census_Bureau/ACSDP5Y2018.DP05-Table-Notes.txt"
## [32] "01_Informacion_Data/US_Census_Bureau/ACSDP5Y2018.DP05_2022-11-01T082752.zip"
## [33] "01_Informacion_Data/US_Census_Bureau/ACSDP5Y2019.DP05-Column-Metadata.csv"
## [34] "01_Informacion_Data/US_Census_Bureau/ACSDP5Y2019.DP05-Data.csv"
## [35] "01_Informacion_Data/US_Census_Bureau/ACSDP5Y2019.DP05-Table-Notes.txt"
## [36] "01_Informacion_Data/US_Census_Bureau/ACSDP5Y2019.DP05_2022-11-01T083027.zip"
## [37] "01_Informacion_Data/US_Census_Bureau/ACSDP5Y2020.DP05-Column-Metadata.csv"
## [38] "01_Informacion_Data/US_Census_Bureau/ACSDP5Y2020.DP05-Data.csv"
## [39] "01_Informacion_Data/US_Census_Bureau/ACSDP5Y2020.DP05-Table-Notes.txt"
## [40] "01_Informacion_Data/US_Census_Bureau/ACSDP5Y2020.DP05_2022-11-01T083111.zip"
## [41] "01_Informacion_Data/US_Census_Bureau/ACSDP5Y2021.DP05-Column-Metadata.csv"
## [42] "01_Informacion_Data/US_Census_Bureau/ACSDP5Y2021.DP05-Data.csv"
## [43] "01_Informacion_Data/US_Census_Bureau/ACSDP5Y2021.DP05-Table-Notes.txt"
## [44] "01_Informacion_Data/US_Census_Bureau/ACSDP5Y2021.DP05_2023-09-12T103937.zip"
## [45] "01_Informacion_Data/US_Census_Bureau/pop_data.rds"
## [46] "01_Informacion_Data/US_Census_Bureau/pop_data.xlsx"
# Obtener archivos de datos en formato CSV
data_files <- list.files(path = my_dir, pattern = "*Data.csv", full.names = TRUE)
# Leer archivos CSV y almacenar en una lista
pop_data <- map(.x = data_files, .f = read.csv, skip = 1, header = TRUE)
# Agregar la columna 'Year' a cada conjunto de datos
for (i in 1:length(pop_data)) {
pop_data[[i]]$Year <- 2010 + i
}
# Combinar la lista de conjuntos de datos en un marco de datos
pop_data <- map_dfr(.x = pop_data, .f = pluck)
# Seleccionar columnas relevantes
pop_data <- pop_data %>%
select(
Geographic.Area.Name,
Estimate..SEX.AND.AGE..Total.population,
Year
)En esta sección, se identifican los archivos CSV que contienen “Data” en su nombre. Estos archivos se leen y manipulan para agregar una columna ‘Year’ a cada conjunto de datos. Luego, se combinan en un único marco de datos y se seleccionan las columnas relevantes.
# Obtener la lista de archivos .csv y .txt en el directorio
files_to_remove <- list.files(path = my_dir, pattern = "\\.(csv|txt)$", full.names = TRUE)
# Verificar si hay archivos para eliminar
if (length(files_to_remove) > 0) {
# Eliminar los archivos
file.remove(files_to_remove)
cat("Archivos .csv y .txt eliminados correctamente en el directorio:", my_dir)
} else {
cat("No hay archivos .csv y .txt para eliminar en el directorio:", my_dir)
}## Archivos .csv y .txt eliminados correctamente en el directorio: 01_Informacion_Data/US_Census_Bureau/
Finalmente, se identifican los archivos temporales (CSV y TXT) y se eliminan. Se proporciona un mensaje indicando si se eliminaron archivos o si no se encontraron archivos para eliminar.
Este código en R se desarrolló con el propósito de importar datos mediante una interfaz de programación de aplicaciones (API) para obtener información relacionada con códigos postales en los Estados Unidos.
# Configurar la URL y claves de la API
url <- "https://us-zip-code-to-income.p.rapidapi.com/"
API_Key <- "b2f499316emsh3019cd6d5c60270p190dc5jsn9e46ae620e51" #uwu xd#
API_Host <- "us-zip-code-to-income.p.rapidapi.com"
request_delay <- 2 # Definir el retardo entre las solicitudes (en segundos)En la sección inicial del código, se establecen las variables esenciales para la configuración de la API. Esto incluye la URL de la API, la clave de autenticación (API_Key), el host de la API (API_Host), y un retardo entre las solicitudes (request_delay) para cumplir con los límites de la API y evitar posibles restricciones.
# missing_zip_codescrime_zip que se quiere extraer de la API
missing_zip_codescrime_zip <- c("48430", "48211", "48760", "48139", "48440")# Cargar la biblioteca
library(httr)
library(jsonlite)
library(tidyverse)
library(fs)
library(rvest)
library(xml2)
library(readxl)
library(dplyr)
# Definir una función para importar datos utilizando la API
data_import_IP <- function(url, API_Key, API_Host, request_delay) {
data_df <- tibble()
for (i in seq_along(missing_zip_codescrime_zip)) {
query_params <- list(zip = missing_zip_codescrime_zip[i])
# Realizar la solicitud GET a la API
response <- GET(url, add_headers("X-RapidAPI-Key" = API_Key, "X-RapidAPI-Host" = API_Host), query = query_params)
# Verificar el estado de la respuesta
stop_for_status(response)
# Convertir la respuesta JSON a un marco de datos
cont_response <- fromJSON(rawToChar(response$content))
# Concatenar el marco de datos resultante
data_df <- bind_rows(data_df, as_tibble(cont_response))
# Imprimir información sobre el código postal procesado
print(str_glue("Zip Code: {missing_zip_codescrime_zip[i]}"))
# Retardo entre las solicitudes para evitar límites de la API
Sys.sleep(request_delay)
}
# Nombrar las columnas del marco de datos resultante
colnames(data_df) <- c("success", "zip", "House Hold Median Income", "household MeanIncome", "familyMedianIncome", "familyMeanIncome", "numHouseholds", "nonFamilyHousehold MedianIncome", "nonFamilyHouseholdMeanIncome", "familyPercentPoverty")
return(data_df)
}La función ‘data_import_IP’ tiene como objetivo principal realizar solicitudes a una API para obtener información relacionada con códigos postales en los Estados Unidos. Aquí está una explicación paso a paso de lo que hace la función:
1.Inicialización del Marco de Datos:
2.Bucle de Importación de Datos:
3.Construcción de Parámetros de Consulta:
4.Solicitud GET a la API:
5.Procesamiento de la Respuesta JSON:
6.Concatenación de Resultados:
7.Impresión de Información del Código Postal:
8.Retardo entre Solicitudes:
Para cumplir con las políticas de velocidad de la API y evitar exceder límites, se introduce un retardo de tiempo (‘Sys.sleep(request_delay)’) entre cada solicitud.
9.Nombrar Columnas del Marco de Datos Resultante:
10.Retorno del Resultado:
# Llamar a la función de importación de datos utilizando la API
result_df <- data_import_IP(url, API_Key, API_Host, request_delay)## Zip Code: 48430
## Zip Code: 48211
## Zip Code: 48760
## Zip Code: 48139
## Zip Code: 48440
En R, puedes crear tus propias funciones y guardarlas en un script separado para luego poder utilizarlas en otros scripts. Aquí hay un ejemplo paso a paso:
1.Crea tu función en un script: * Abre un nuevo script en R (puedes usar un editor de texto o un entorno de desarrollo como RStudio). Define tu función y guárdala en el script. Por ejemplo, crea un archivo llamado misFunciones.R con el siguiente contenido:
2.Guarda el script: * Guarda el script con el nombre que hayas elegido, en este caso, ‘misFunciones.R’.
3.Usa la función en otro script: * En otro script o en la consola de R, puedes cargar el script que contiene tus funciones usando la función ‘source’. Aquí hay un ejemplo:
# scriptPrincipal.R
# Cargar el script que contiene las funciones
> source("misFunciones.R")
# Ahora puedes utilizar la función en este script
> resultado_suma <- sumaDosNumeros(3, 5)
> print(resultado_suma)
En estas líneas de código se utilizan para almacenar el objeto ‘pop_data’ en un archivo RDS y luego cargarlo de nuevo en el entorno de trabajo de R en el objeto ‘pop_data’. Este proceso es útil para persistir datos entre sesiones de trabajo o compartir datos de manera eficiente, ya que el formato RDS conserva la estructura y los tipos de datos del objeto original.
# Definir valores de prueba para DWD_MI_Zip y crime_zip
DWD_MI_Zip <- c("10001", "20002", "30303", "40004", "50005")
crime_zip <- c("10001", "30303", "50005", "60006", "70007")
# Comprobar si los conjuntos de códigos postales son idénticos
identical_result <- identical(DWD_MI_Zip, crime_zip)
print(paste("Los conjuntos son idénticos:", identical_result))## [1] "Los conjuntos son idénticos: FALSE"
La función identical() se utiliza para verificar si dos objetos son idénticos entre sí. La función devuelve un valor lógico (TRUE o FALSE) según si los objetos son idénticos o no.
# Mostrar los códigos postales que faltan en cada conjunto
missing_DWD_MI_Zip <- DWD_MI_Zip[!DWD_MI_Zip %in% crime_zip]
missing_crime_zip <- crime_zip[!crime_zip %in% DWD_MI_Zip]
print("Códigos postales que faltan en DWD_MI_Zip:")## [1] "Códigos postales que faltan en DWD_MI_Zip:"
## [1] "20002" "40004"
## [1] "Códigos postales que faltan en crime_zip:"
## [1] "60006" "70007"
Este código en R tiene como objetivo identificar y mostrar los códigos postales que faltan en dos conjuntos de datos, DWD_MI_Zip y crime_zip. Utiliza la función %in% para realizar la comparación entre los dos conjuntos y determinar los elementos que no están presentes en ambos.
La librería scales en R proporciona funciones para transformar y formatear datos, especialmente útiles para la visualización de gráficos. Aquí hay un resumen de las principales funciones y utilidades proporcionadas por scales:
# Cargar la biblioteca
library(scales)
# Numero de prueba
number <- 5.1234567
# Formato de dolares
number |>
scales::dollar()## [1] "$5.12"
## [1] "512.35%"
# Crear un vector de fechas
dates <- as.Date(c("2022-01-15 12:30:00", "2022-02-20 15:45:00", "2022-03-25 18:15:00"))
# Formatear las fechas en el estilo "día de la semana, mes día, año"
formatted_dates <- date_format("%A, %B %d, %Y")(dates)
print(formatted_dates)## [1] "sábado, Enero 15, 2022" "domingo, Febrero 20, 2022"
## [3] "viernes, Marzo 25, 2022"
# Crear un vector de horas
times <- as.POSIXct(c("2022-01-15 12:30:00", "2022-02-20 15:45:00", "2022-03-25 18:15:00"))
# Formatear las horas en el estilo "hora:minuto AM/PM"
formatted_times <- time_format("%I:%M %p")(times)
print(formatted_times)## [1] "05:30 p. m." "08:45 p. m." "11:15 p. m."
# Crear un vector de fechas y horas
datetime <- as.POSIXct(c("2022-01-15 12:30:00", "2022-02-20 15:45:00", "2022-03-25 18:15:00"))
# Formatear las fechas y horas en el estilo "día de la semana, mes día, año hora:minuto AM/PM"
formatted_datetime <- date_format("%A, %B %d, %Y %I:%M %p")(datetime)
print(formatted_datetime)## [1] "sábado, Enero 15, 2022 05:30 p. m."
## [2] "domingo, Febrero 20, 2022 08:45 p. m."
## [3] "viernes, Marzo 25, 2022 11:15 p. m."
En R, la función ‘filter’ se utiliza comúnmente para extraer filas específicas de un conjunto de datos basándose en condiciones específicas. Aquí tienes algunos ejemplos de cómo usar la función ‘filter’:
library(dplyr)
# Crear un ejemplo de dataframe
df <- data.frame(
ID = c(1, 2, 3, 4, 5, 6),
Name = c("Alice", "Bob", "Charlie", "David", "Eva", "Fernanda"),
Age = c(25, 30, 22, 35, 28, NaN),
Gender = c("Female", "Male", "Male", "Male", "Female", "Female")
)
df# Filtrar personas mayores de 25 años y de género femenino
result <- filter(df, Age > 25 & Gender == "Female")
resultlibrary(naniar)
# Resumen de valores faltantes en el conjunto de datos filtrado
miss_val_resumen <- df |>
miss_case_summary()
# Imprimir el resumen
miss_val_resumenLa función mutate() es parte del paquete dplyr en R y se utiliza para realizar transformaciones en columnas existentes o agregar nuevas columnas a un conjunto de datos. Esta función es comúnmente utilizada en el contexto de manipulación y transformación de datos.
# Instala e carga las librerías necesarias si no las has instalado
library(dplyr)
library(lubridate)
# Crear un conjunto de datos ficticio con una columna de fechas
datos <- data.frame(
Date_chr = c("2022-01-15", "2021-08-22", "2023-03-10")
)
# Utilizar mutate() y year() para crear una nueva columna "Year"
datos_con_year <- datos %>%
mutate(Year = year(ymd(Date_chr)))
# Imprimir el conjunto de datos resultante
datos_con_year# Crear ejemplo de df1
df1 <- data.frame(
ID = c(1, 2, 3, 4, 2, 3, 4),
Nombre = c("Alice", "Bob", "Charlie", "David","Bob", "Charlie", "David"),
Apellido = c("Smith", "Johnson", "Garcia", "Fisher","Johnson", "Garcia", "Fisher")
)
# Crear ejemplo de df2
df2 <- data.frame(
ID = c(2, 3, 4, 5, 3, 4, 2),
Ventas = c(2250, 5047, 5461, 7539, 2250, 5047, 5461)
)# Ejemplo de agrupación y resumen
ventas_resumen <- merged_df %>%
group_by(Nombre) %>%
summarise(Total_Ventas = sum(Ventas))
ventas_resumen# Ejemplo de combinación de columnas
merged_df <- merged_df %>%
mutate(Nueva_Columna = paste(Nombre, Apellido, sep = "-"))
merged_dfLos gráficos desempeñan un papel fundamental en el análisis de datos y la visualización de resultados en el ámbito de la programación estadística, y R se destaca como un lenguaje de programación especialmente poderoso para la creación de gráficos.
# Cargar bibliotecas necesarias
library(readxl)
library(tidyverse)
library(naniar)
library(lubridate)
library(stringr)
library(fs)
library(scales)
library(ggplot2)
library(plotly)
library(tidyquant)
library(ggrepel)
# Fuente de las funciones personalizadas
source("06_funciones_y_interacion_iteration/Zillow_PC_Function.R")
source("06_funciones_y_interacion_iteration/funciones_de_importacion.R")
# Obtener datos de ciudades con la Tasa de Crecimiento Anual Compuesta (CAGR) para los años 2000 a 2022
CAGR_Data <- getTopCitiesByCAGR(2000, 2022, 30)
# Importar datos del Índice del Mercado Inmobiliario de Zillow (ZMI)
ZMI_Data_Prep <- data_import("ZMI_data_pre")
# Combinar los marcos de datos CAGR_Data y ZMI_Data_Prep en la columna "City_zip"
ZillowTrends <- CAGR_Data |> left_join(ZMI_Data_Prep, by = "City_zip")
ZillowTrendsUtilizando la función ‘gg_miss_var’ de la biblioteca ‘naniar’ para visualizar los valores perdidos en los datos.
# Seleccionar las columnas relevantes en el marco de datos ZillowTrends
ZillowTrends <- ZillowTrends |>
select(City_zip, Year, Z_Home_Value_Index, ZHVI_PC_YoY, ZHVI_PC_YoY_chr, timeperiod, Number_of_Years, CAGR)
# Calcular la tasa de crecimiento promedio (CAGR) para todos los datos
ave_rate <- ZillowTrends |>
pull(CAGR) |>
mean() |>
scales::percent(accuracy = 0.01)
# Obtener el año mínimo y máximo en el conjunto de datos ZillowTrends
min_y <- ZillowTrends |>
pull(Year) |>
min()
max_y <- ZillowTrends |>
pull(Year) |>
max()
# Agregar una nueva columna 'tool_tip' con información para etiquetas emergentes
ZillowTrends <- ZillowTrends |>
mutate(tool_tip = str_glue("CityZip: {City_zip},
%Change: {ZHVI_PC_YoY_chr},
Year: {Year}"))
# Crear un gráfico ggplot
g <- ZillowTrends |> ggplot(aes(x = Year, y = ZHVI_PC_YoY, color = City_zip, text = tool_tip, group = City_zip)) +
geom_line(linewidth = 1) +
geom_point(size = 2, alpha = 0.5) +
geom_hline(yintercept = 0, linetype = "dashed", color = "black", linewidth = 0.50) +
labs(
title = "Apreciación de Precios de Viviendas Año tras Año",
subtitle = str_glue("Cambio porcentual YoY de {min_y} a {max_y}"),
x = "AÑO",
y = "Cambio Porcentual (%)",
caption = str_glue("De {min_y} a {max_y}, la CAGR promedio ha sido {ave_rate} \n para estos 30 principales códigos postales en el Área Metropolitana de Detroit")
)
# Mostrar el gráfico
g##Convierte el gráfico a un gráfico interactivo
Convierte el gráfico creado con ggplot2 a un gráfico interactivo utilizando plotly y especifica que las etiquetas de herramientas deben tomarse de la columna ‘tool_tip’.
# Crear un gráfico ggplot con facetas (Plot 2)
g <- ZillowTrends |> ggplot(aes(x = Year, y = ZHVI_PC_YoY, color = City_zip, text = tool_tip, group = City_zip)) +
geom_line(linewidth = 1) + # Agregar líneas para representar los datos
geom_point(size = 2, alpha = 0.5) + # Agregar puntos para representar los datos
geom_hline(yintercept = 0, linetype = "dashed", color = "black", linewidth = 0.50) + # Agregar línea horizontal en y=0
facet_wrap(~ City_zip, scales = "free_y") + # Facetar el gráfico por código postal con escalas independientes en el eje y
labs(
title = "Apreciación de Precios de Viviendas Año tras Año",
subtitle = str_glue("Cambio porcentual YoY de {min_y} a {max_y}"),
x = "AÑO",
y = "Cambio Porcentual (%)",
caption = str_glue("De {min_y} a {max_y}, la CAGR promedio ha sido {ave_rate} \n para estos 30 principales códigos postales en el Área Metropolitana de Detroit")
) +
theme_minimal() + # Puedes ajustar el tema según tus preferencias
theme(
plot.title = element_text(size = 20, face = "bold"),
axis.title.x = element_text(size = 16),
axis.title.y = element_text(size = 16),
axis.text.x = element_text(size = 6),
axis.text.y = element_text(size = 6),
legend.text = element_text(size = 12)
) +
guides(color = guide_legend(override.aes = list(size = 4))) # Ajustar el tamaño de la leyenda
g# Convertir el gráfico ggplot a una versión interactiva usando plotly
g_plotly <- g |> ggplotly(tooltip = "tool_tip")
# Ajustar el tamaño del gráfico plotly
g_plotly <- g_plotly %>%
config(displayModeBar = TRUE) %>% # Puedes desactivar la barra de herramientas si lo prefieres
layout(width = 1000, height = 600) # Ajustar el tamaño según tus preferencias
# Mostrar el gráfico plotly
g_plotlyEmployment_C <- data_import("Employment_C")
# Calcular el promedio del cambio porcentual YoY del índice de valor de la vivienda (ZHVI_PC_YoY) por año
avg_zhvi_pc_by_year <- ZMI_Data_Prep |>
group_by(Year) |>
summarise("Home Value Index" = ZHVI_PC_YoY |> mean())
# Combinar datos de empleo y datos del índice de valor de la vivienda por año
homev_vs_Job_growth <- Employment_C |>
left_join(avg_zhvi_pc_by_year, by = "Year") |>
select(Year, PC_YoY, "Home Value Index") |>
mutate("Employment in Metro Detroit" = PC_YoY) |>
gather(key = "Legend", value = "Percentage_Change", "Employment in Metro Detroit", "Home Value Index")
# Modificar el formato de porcentaje y la etiqueta del texto
homev_vs_Job_growth <- homev_vs_Job_growth |>
mutate(PC_YoY_chr = Percentage_Change |> scales::percent(accuracy = 0.01)) |>
mutate(Percentage_Change = (Percentage_Change * 100)) |>
mutate(label_text = str_glue("Legend:{Legend},
Year:{Year},
Percentage:{PC_YoY_chr}"))
# Calcular el número de códigos postales únicos en ZMI_Data_Prep
num_of_zip <- ZMI_Data_Prep |> select(City_zip) |> unique() |> nrow()
# Crear el gráfico ggplot para el Plot 3
p3 <- homev_vs_Job_growth |>
drop_na(Percentage_Change) |>
ggplot(aes(x = Year, y = Percentage_Change, linetype = Legend, colour = Legend, label = label_text)) +
geom_line(linewidth = 1) +
geom_point(aes(text = label_text), size = 2) +
geom_hline(yintercept = 0, linetype = "dashed", color = "gray0", size = 0.50)+
labs(
title = "Precios de Viviendas vs Empleo",
subtitle = "Cambio Porcentual YoY entre Precios de Viviendas y Empleo",
y = "Cambio Porcentual (%)",
caption = str_glue("Las fuentes de datos son 'Zillow' y 'Bureau of Labor Statistics'.
Los datos de empleo son del área de Empleo de Detroit-Warren-Dearborn.
El Índice de Valor de la Vivienda es la media del cambio de {num_of_zip} códigos postales en el área de Detroit-Warren-Dearborn.'"
)) +
theme_light()
# Convertir el gráfico ggplot a una versión interactiva usando plotly
p3_plotly <- p3 |> ggplotly(tooltip = "text")
# Mostrar el gráfico plotly
p3_plotlyp3 + theme (
plot.title = element_text(color="dark blue", size = 12, face = "bold"),
plot.subtitle = element_text(color="dark blue", size = 10, face = "italic"),
plot.caption = element_text(color="dark blue", size = 8, face = "bold.italic")
)